package com.baiqian.doupo.capability.douqi;

import com.baiqian.doupo.douji.DouJi;
import com.baiqian.doupo.gongfa.GongFa;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World;
import net.minecraftforge.common.util.INBTSerializable;

import java.util.ArrayList;

public interface IDouQiCapability extends INBTSerializable<CompoundNBT> {//新建斗气能力

    /**
     * 玩家重生函数
     * <p>将玩家的当前数据重置</p>
     */
    void rebirth();
    /**
     * 试图升级
     * @param player_entity 被升级的玩家
     */
    void tryToUpLevel(PlayerEntity player_entity);//尝试升级
    /**
     * 获得当前境界名
     */
    String getDouQiLevelStr();
    /**
     * 获得肉身基本伤害
     */
    double getBaseDamage();
    /**
     * 获得肉身基本防御
     */
    double getBaseDefense();
    /**
     * 获得当前输出能力下的最大斗气输出:已经解压
     */
    double getMaxDouQiPay();
    /**
     * 获得伤害:肉体与斗气与功法与斗技共同加持
     */
    double getDamage();
    /**
     * 获得防御:肉体与斗气与功法与斗技共同加持
     */
    double getDefense();
    /**
     * 获得当前灵魂力百分比
     */
    double getSoulPercentage();
    /**
     * 是否正在修炼
     */
    boolean isGettingDouQi(PlayerEntity player_entity);
    /**
     * 获得体质名称
     */
    TranslationTextComponent getBodyName();
    /**
     * 获得眼睛名称
     */
    TranslationTextComponent getEyeName();
    /**
     * 斗气境界升级
     */
    void addDouQiLevel(PlayerEntity player_entity);
    /**
     * 更新环境浓度
     */
    void updateWorldAttr(PlayerEntity player, World world);

    /**
     * 获取该等级升级每tick的消耗
     */
    double getLevelUpPay();

    //==============================================


    /**
     * 增加进阶已经过去了多长时间(tick)
     * @param num 已经过去了多少tick
     */
    void addLevelUpTime(int num);
    /**
     * 设置进阶已经过去了多长时间(tick)
     * @param num 已经过去了多少tick
     */
    void setLevelUpTime(int num);
    /**
     * 获取进阶已经过去了多长时间(tick)
     */
    int getLevelUpTime();
    /**
     * 获取本次进阶应该达到多少时间
     */
    int getLevelUpTimeMax();
    /**
     * 默认修炼时吸收斗气用
     * <p>受环境等影响，按无压缩的斗气基本量吸收</p>
     * douqi_attraction,0,true,player_entity
     */
    void addDouQi(PlayerEntity player_entity);
    /**
     * 增减斗气
     * <p>num的意义：</p>
     * <p>level为0：增减完全压缩前斗气</p>
     * <p>level为1：增减完全压缩后斗气(默认)</p>
     * <p>level为2：增减此境界压缩前斗气</p>
     * <p>level为3：增减此境界压缩后斗气(等同于1)</p>
     * @param num 体增/减数值(每tick增减多少斗气)
     * @param level 压缩等级
     * @param is_be_affect 是否被灵魂力，环境，功法影响
     * @param player_entity 被设置的玩家
     */
    void addDouQi(double num,int level,boolean is_be_affect,PlayerEntity player_entity);
    /**
     * 设置斗气
     * <p>num的意义：</p>
     * <p>level为0：设置完全压缩前斗气</p>
     * <p>level为1：设置完全压缩后斗气(默认)</p>
     * <p>level为2：设置此境界压缩前斗气</p>
     * <p>level为3：设置此境界压缩后斗气(等同于1)</p>
     * @param num 斗气数值
     * @param level 压缩等级
     * @param player_entity 被设置的玩家
     */
    void setDouQi(double num,int level,PlayerEntity player_entity);
    /**
     * 获取斗气
     * <p>num的意义：</p>
     * <p>level为0：获取完全压缩前斗气</p>
     * <p>level为1：获取完全压缩后斗气</p>
     * <p>level为2：获取此境界压缩前斗气</p>
     * <p>level为3：获取此境界压缩后斗气(等同于1)</p>
     * @param level 压缩等级
     */
    double getDouQi(int level);
    /**
     * 设置当前修炼用斗气上限值
     * @param num 斗气上限值
     * @param player_entity 被设置斗气上限值的玩家
     */
    void setDouQiHaveMax(double num,PlayerEntity player_entity);
    /**
     * 获取修炼提升等级用斗气上限值
     */
    double getDouQiHaveMax();
    /**
     * 该修炼等级的斗气上限值,突破该值即升级
     */
    double getDouQiHaveMaxLevelUp();
    /**
     * 获得当前大境界
     */
    int getLevelBig();
    /**
     * 该获得当前中境界
     */
    int getLevelMiddel();
    /**
     * 获得当前小境界
     */
    int getLevelSmall();
    /**
     * 获得境界总和
     */
    int[] getLevelAll();
    /**
     * 使斗气的提纯程度增加
     * <p>默认速率douqi_compress_attraction增加</p>
     * @param player_entity 被增加提纯程度的玩家
     */
    void addDouQiCompress(PlayerEntity player_entity);
    /**
     * 使斗气的提纯程度减少
     * <p>默认速率douqi_compress_attraction减少</p>
     * @param player_entity 被减少提纯程度的玩家
     */
    void loseDouQiCompress(PlayerEntity player_entity);
    /**
     * 使斗气的提纯程度增加
     * @param num 提纯增加多少
     * @param is_be_affect 是否经受灵魂力，已经压缩程度，功法的影响
     * @param player_entity 被增加提纯程度的玩家
     */
    void addDouQiCompress(double num,boolean is_be_affect,PlayerEntity player_entity);
    /**
     * 设置斗气提纯程度
     * @param num 斗气提纯程度
     * @param player_entity 被设置斗气提纯程度的玩家
     */
    void setDouQiCompress(double num,PlayerEntity player_entity);
    /**
     * 获取斗气提纯程度
     */
    double getDouQiCompress();
    /**
     * 获取完全的总压缩程度
     * <p>douqi_compress*(douqi_compress_all-douqi_compress_should_all+1)</p>
     */
    double getExCompressAll();
    /**
     * 获得总提纯
     * <p>所有的境界累计的压缩程度</p>
     */
    double getCompressAll();
    /**
     * 获得应该的总提纯
     * <p>从未压缩到现在的境界应该有的压缩程度</p>
     */
    double getCompressShouldAll();
    /**
     * 获取当前境界下压缩的难度
     */
    double getCompressAttractioinDiff();
    /**
     * 每tick斗气提纯量
     * <p>初始每tick为0.0016</p>
     * <p>每30s1压缩</p>
     */
    double getCompressAttractioin();
    /**
     * 获得每tick斗气吸收量
     * <p>初始每tick为0.00083</p>
     * <p>每分钟1斗气</p>
     */
    double getDouQiAttraction();
    /**
     * 获得晋级每tick斗气消耗量
     */
    double getDouQiLevelUpPay();
    /**
     * 获取实际输出百分比
     */
    double getExDouQiReleasePercentage();
    /**
     * 增加斗气输出百分比
     */
    void addDouQiReleasePercentage();
    /**
     * 减少斗气输出百分比
     */
    void loseDouQiReleasePercentage();
    void setDouQiReleasePercentage(double num);
    /**
     * 获取斗气个人最大输出百分比
     */
    double getDouQiReleasePercentage();
    /**
     * 设置斗气最大输出百分比
     */
    void setDouQiReleasePercentageMax(double num);
    /**
     * 获取斗斗气最大输出百分比
     */
    double getDouQiReleasePercentageMax();
    /**
     * 获得灵魂主属性
     */
    byte getSoulPropertyMain();
    /**
     * 获得灵魂属性
     */
    boolean[] getSoulProperty();
    /**
     * 增加当前灵魂力
     * <p>默认被功法影响</p>
     */
    void addSoul();
    /**
     * 增加当前灵魂力
     * @param num 增加多少
     * @param is_be_affect 是否被功法影响
     */
    void addSoul(double num,boolean is_be_affect);
    /**
     * 设置灵魂强度
     */
    void setSoul(double num);
    /**
     * 获得当前灵魂力
     */
    double getSoul();
    /**
     * 获得灵魂每秒回复数值
     */
    double getSoulAttractionNum();
    /**
     * 增加当前灵魂力上限
     */
    void addSoulMax(double num);
    /**
     * 设置灵魂最大强度
     */
    void setSoulMax(double num);
    /**
     * 获得灵魂力上限
     */
    double getSoulMax();
    /**
     * 增加异火
     */
    boolean addFire(byte num);
    /**
     * 设置异火
     */
    void setFire(boolean[] fire_array);
    /**
     * 获得异火
     */
    boolean[] getFire();
    /**
     * 设置体质
     */
    void setBody(byte num);
    /**
     * 获得体质
     */
    byte getBody();
    /**
     * 设置眼睛
     */
    void setEye(byte num);
    /**
     * 获得眼睛
     */
    byte getEye();
    /**
     * 设置是否在进大阶
     */
    void isToLevelBig(boolean is_to_level_up);
    /**
     * 获取是否在进大阶
     */
    boolean isToLevelBig();
    /**
     * 设置是否在进中阶
     */
    void isToLevelMiddle(boolean is_to_level_up);
    /**
     * 获取是否在进中阶
     */
    boolean isToLevelMiddle();
    /**
     * 设置是否在进小阶
     */
    void isToLevelSmall(boolean is_to_level_up);
    /**
     * 获取是否在进小阶
     */
    boolean isToLevelSmall();
    /**
     * 设置斗气化翼是否开启
     */
    void isFlying(boolean flag);
    /**
     * 获取斗气化翼是否开启
     */
    boolean isFlying();
    /**
     * 设置周围环境相应属性斗气浓度
     */
    void setWorldAttr(double[] worldAttrArray);
    /**
     * 获取周围环境相应属性斗气浓度
     */
    double[] getWorldAttr();
    /**
     * 是否正在扫描方块
     */
    boolean isScaningBlock();
    /**
     * 设置是否正在扫描方块
     */
    void isScaningBlock(boolean flag);
    /**
     * 增加指定功法
     */
    void addGongFa(GongFa gong_fa);
    /**
     * 获得所有功法
     */
    ArrayList<GongFa> getGongFas();
    /**
     * 设置选择的功法
     */
    void setGongFaChoose(int num);
    /**
     * 获得选择的功法
     */
    int getGongFaChoose();
    /**
     * 增加指定斗技
     */
    void addDouJi(DouJi dou_ji);
    /**
     * 获得所有斗技
     */
    ArrayList<DouJi> getDouJis();
    /**
     * 设置选择的斗技组
     */
    void setDouJiGroupChoose(int num);
    /**
     * 获得现在选择的是第几组
     */
    int getDouJiGroupChoose();
    /**
     * 设置当前16个斗技
     */
    void setDouJiGroup(int []num);
    /**
     * 获得16个斗技
     */
    int[] getDouJiGroup();
//    /**
//     * 获得1点斗气能提供多少攻击力
//     */
//    double getAttackNum();
//    /**
//     * 获得1点斗气能提供多少防御力
//     */
//    double getDefenseNum();
//    /**
//     * 获得1点斗气能提供多少治愈力
//     */
//    double getRecoverNum();



}
